home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 140 / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin / tools / dshell / dsh333bs.lzh / dprn.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-08-10  |  8.8 KB  |  471 lines

  1. /*
  2.     dshell    v3
  3.  
  4.     印刷周り関係
  5. */
  6.  
  7. #include    "dsh.h"
  8.  
  9.  
  10. static void prn_one_lin(int, FILE *);
  11. static void d_print2(int, int, int, int);
  12. static void hcopy(void);
  13.  
  14.  
  15.  
  16. void
  17. d_print()
  18. {
  19.     FILE *fp;
  20.     int i;
  21.  
  22.     if (printer_init()) {
  23. #ifdef DEBUG
  24.         fp = fopen("xcon", "w");
  25.         if (fp == NULL) {
  26.             return;
  27.         }
  28. #else
  29.         fp = stdprn;    //fp = fopen("prn", "w");
  30. #endif
  31.         w_open();
  32.         w_mes(1, "プリンタへ出力中です");
  33.         w_mes(2, "[ESC]:印刷中止");
  34.         i = 0;
  35.         while (1) {
  36.             if (esc_on()) {
  37.                 clr_kbf();
  38.                 break;
  39.             }
  40.             clr_kbf();
  41.             prn_one_lin(i, fp);
  42.             ++i;
  43.             if (i >= lpmx) {
  44.                 break;
  45.             }
  46.         }
  47.         w_close();
  48. #ifdef    DEBUG
  49.         fclose(fp);
  50. #endif
  51.     } else {
  52.         w_open();
  53.         w_mes(0, "プリンタへの出力ができません!");
  54.         w_wait(0);
  55.         w_close();
  56.     }
  57.     wait_mb_off();
  58. }
  59.  
  60. /*
  61.     たれ流し(?)プリントアウト
  62. */
  63. static void
  64. prn_one_lin(int lin, FILE *fp)
  65. {
  66.     int in, n;
  67.     uchar buf[256], *p;
  68.  
  69.     strcpy(buf, lhp[lin]);
  70.     if (buf[0] == CTRL_CHAR) {
  71.         if ((buf[1] | 0x20) == VEXEC_CHAR) {
  72.             buf[0] = (uchar)(L'◎' >> 8);
  73.             buf[1] = (uchar)(L'◎');
  74.         } else if (buf[1] == HR_CHAR) {
  75.             strcpy(buf, buf + 2);
  76.         }
  77.     }
  78.     if (buf[0] == NORM_CHAR)
  79.         strcpy(buf, buf + 1);
  80.     for (p = buf; in = dinstrchr(p, '\x1b');) {    // ^[
  81.         p += in;
  82.         n = isEscSeq(p);
  83.         if (n > 0 && p[n - 1] == 'C') {
  84.             uchar buf2[256];
  85.             strcpy(buf2, p + n);
  86.             sprintf(p - 1, "%*s%s", atoi(p + 1), "", buf2);
  87.             p--;
  88.         } else if (n > 0 && p[n - 1] == 'D') {
  89.             uchar buf2[256];
  90.             strcpy(buf2, p + n);
  91.             p--;
  92.             while (--n >= 0)
  93.                 *p++ = '\b';
  94.             strcpy(p, buf2);
  95.         } else {
  96.             strcpy(p - 1, p + n);
  97.             p--;
  98.         }
  99.     }
  100.     for (p = buf; in = dinstrchr(p, CTRL_CHAR);) {    // %V%W, %CUT, TYPE=
  101.         p += in - 1;
  102.         switch (*(p + 1)) {
  103.         case LARGE_CHAR:
  104.             strcpy(p, p + 4);    // %V%W の内部表現は4バイト
  105.             p += dinstrchr(p, '\x18') - 1;
  106.             strcpy(p, p + 1);
  107.             break;
  108.         case SMALL_CHAR:
  109.             strcpy(p, p + 2);    // %v%w の内部表現は2バイト
  110.             p += dinstrchr(p, '\x18') - 1;
  111.             strcpy(p, p + 1);
  112.             break;
  113.         case CUT_CHAR:
  114.             *p++ = '%';
  115.             *p++ = 'C';
  116.             *p++ = 'U';
  117.             *p++ = 'T';
  118.             strcpy(p, p + 6 - 4);    // %CUT の内部表現は6バイト
  119.             break;
  120.         case BOX_CHAR:
  121.             *p++ = *(p + 4);        // 桁合わせが面倒なので左端だけ
  122.             *p++ = *(p + 5 - 1);
  123.             strcpy(p, p + 9 - 2);    // %box の内部表現は9バイト
  124.             break;
  125.         case FONT_CHAR:
  126.             {
  127.                 uchar *q;
  128.                 for (q = p; *q++ != NORM_CHAR;)
  129.                     ;
  130.                 strcpy(p, q);
  131.             }
  132.             break;
  133.         case TYPE_CHAR:
  134.             strcpy(p, p + 1);
  135.             strcat(p, ">");
  136.             break;
  137.         case NULTYPE_CHAR:
  138.             *p++ = '(';
  139.             strcpy(p, p + 1);
  140.             strcat(p, ")");
  141.             break;
  142.         case EFONT_CHAR:
  143.         default:
  144.             strcpy(p, p + 1);
  145.             break;
  146.         }
  147.     }
  148.     for (p = buf; in = dinstrchr(p, '\x18');) {    // ^X
  149.         p += in - 1;
  150.         strcpy(p, p + 1);
  151.     }
  152.     for (p = buf; in = dinstrchr(p, '\f');) {
  153.         p += in - 1;
  154.         *p++ = ' ';
  155.     }
  156.  
  157.     fprintf(fp, "%s\n", buf);
  158. }
  159.  
  160.  
  161.  
  162. struct menuitem {
  163.     int ox;
  164.     int oy;
  165.     char *item;
  166. };
  167. static int HCSIZE;
  168. static int H_size = 0;
  169. static int Gamen = 4;
  170. static int Iti = 8;
  171. static int Koukan = 10;
  172.  
  173. int PM_X;
  174. int PM_Y;
  175.  
  176. static void
  177. item_rev(const struct menuitem items[], int old, int new)
  178. {
  179.     B_COLOR(3);
  180.     B_LOCATE(PM_X + items[old].ox, PM_Y + items[old].oy);
  181.     B_PRINT(items[old].item);
  182.     B_COLOR(9);
  183.     B_LOCATE(PM_X + items[new].ox, PM_Y + items[new].oy);
  184.     B_PRINT(items[new].item);
  185.     B_COLOR(3);
  186. }
  187.  
  188. /*
  189.     menu_sx:[印刷]メニューのX始桁
  190. */
  191. void
  192. prn_menu(int menu_sx)
  193. {
  194.     static const struct menuitem items[]=
  195.     {
  196.         17, 5, "縮小コピー",
  197.         29, 5, "拡大コピー",
  198.         17, 7, "1",
  199.         21, 7, "2",
  200.         25, 7, "3",
  201.         29, 7, "4",
  202.         33, 7, "5",
  203.         37, 7, "全部",
  204.         17, 9, "先頭から",
  205.         27, 9, "今表示されている位置から",
  206.         17, 11, "手で交換",
  207.         27, 11, "連続打ち",
  208.         37, 11, "FFを挿入して連続打ち",
  209.         17, 13, "印刷実行",
  210.         35, 13, "キャンセル",
  211.         0, 0, ""
  212.     };
  213.  
  214.     int old = 0;
  215.     int rtn;
  216.     int dmx, dmy, bl, br;
  217.     int px, py, i, cansel = FALSE;
  218.     int end_sw = 1;
  219.  
  220.     /* pcm8+zmusic(v2.00未満)が常駐しているかどうかチェック */
  221.     if (on_pcm8() && (i = on_zmusic()) && i < 0x200) {
  222.         w_open();
  223.         w_mes(0, "PCM8とZMUSIC(v2.00未満)が同時に常駐しています");
  224.         w_mes(2, "ハードコピーによる印刷はできません");
  225.         w_wait(0);
  226.         w_close();
  227.         return;
  228.     } else if (killed_trap12()) {
  229.         w_open();
  230.         w_mes(0, "HARD COPY割込み(TRAP 12)が無効にされています");
  231.         w_mes(2, "ハードコピーによる印刷はできません");
  232.         w_wait(0);
  233.         w_close();
  234.         return;
  235.     }
  236.  
  237.     PM_X = CWIDTH - 64;
  238.     PM_Y = 15;
  239.  
  240.     msarea((PM_X + 1) * 8, (PM_Y + 3) * 16 + 8, (PM_X + 62) * 8, 511);
  241.     B_COLOR(5);
  242.     win_frame(PM_X, PM_Y, PM_X + 62, PM_Y + 15, PM_Y + 3, menu_sx - 1);
  243.     B_COLOR(3);
  244.  
  245.     B_LOCATE(PM_X + 3, PM_Y + 1);
  246.     B_PRINT("◆◇◆ ハードコピーを利用してプリンタに出力します ◆◇◆");
  247.     B_LOCATE(PM_X + 13, PM_Y + 2);
  248.     B_PRINT("印刷中に[ESC]を押すと中止できます");
  249.     for (i = 0; *(items[i].item); i++) {
  250.         B_LOCATE(PM_X + items[i].ox, PM_Y + items[i].oy);
  251.         B_PRINT(items[i].item);
  252.     }
  253.     B_LOCATE(PM_X + 3, PM_Y + 5);
  254.     B_PRINT("印字サイズ :");
  255.     B_LOCATE(PM_X + 3, PM_Y + 7);
  256.     B_PRINT("1頁何画面 :");
  257.     B_LOCATE(PM_X + 3, PM_Y + 9);
  258.     B_PRINT("印字開始頁 :");
  259.     B_LOCATE(PM_X + 3, PM_Y + 11);
  260.     B_PRINT("紙送りモード:");
  261.  
  262.     item_rev(items, H_size, H_size);
  263.     item_rev(items, Gamen, Gamen);
  264.     item_rev(items, Iti, Iti);
  265.     item_rev(items, Koukan, Koukan);
  266.  
  267.     wait_mb_off();
  268.  
  269.     while (!cansel) {
  270.  
  271.         do {
  272.             p_time(0);
  273.             dmspos(&px, &py);    /*    ver2.3で追加    */
  274.             dmsstat(&dmx, &dmy, &bl, &br);    /*    ver2.3で追加    */
  275.         } while (!bl && !br);
  276.  
  277.         if (br) {    /* 右ボタンでescape */
  278.             cansel = TRUE;
  279.             break;
  280.         }
  281.         wait_mb_off();
  282.         dmspos(&px, &py);    /*    ver2.3で追加    */
  283.         px = px / 8 - PM_X;
  284.         py = py / 16 - PM_Y;
  285.         if (px >= 17) {
  286.             if (py == 5) {
  287.                 old = H_size;
  288.                 if (px < 27) {
  289.                     H_size = 0;
  290.                 } else if ((px >= 29) && (px < 39)) {
  291.                     H_size = 1;
  292.                 }
  293.                 item_rev(items, old, H_size);
  294.             } else if (py == 7) {
  295.                 old = Gamen;
  296.                 i = (px - 17) / 2;
  297.                 switch (i) {
  298.                 case 0:
  299.                     Gamen = 2;
  300.                     break;
  301.                 case 2:
  302.                     Gamen = 3;
  303.                     break;
  304.                 case 4:
  305.                     Gamen = 4;
  306.                     break;
  307.                 case 6:
  308.                     Gamen = 5;
  309.                     break;
  310.                 case 8:
  311.                     Gamen = 6;
  312.                     break;
  313.                 case 10:
  314.                     Gamen = 7;
  315.                     break;
  316.                 case 11:
  317.                     Gamen = 7;
  318.                     break;
  319.                 }
  320.                 item_rev(items, old, Gamen);
  321.             } else if (py == 9) {
  322.                 old = Iti;
  323.                 if (px < 25) {
  324.                     Iti = 8;
  325.                 }
  326.                 if ((px >= 27) && (px < 51)) {
  327.                     Iti = 9;
  328.                 }
  329.                 item_rev(items, old, Iti);
  330.             } else if (py == 11) {
  331.                 old = Koukan;
  332.                 if (px < 25) {
  333.                     Koukan = 10;
  334.                 }
  335.                 if ((px >= 27) && (px < 35)) {
  336.                     Koukan = 11;
  337.                 }
  338.                 if ((px >= 37) && (px < 59)) {
  339.                     Koukan = 12;
  340.                 }
  341.                 item_rev(items, old, Koukan);
  342.             } else if (py == 13) {
  343.                 if (px < 25) {
  344.                     if ((rtn = printer_init()) == 0) {
  345.                         w_open();
  346.                         w_mes(0, "プリンタへの出力ができません!");
  347.                         w_wait(0);
  348.                         p_scr();
  349.                     } else {
  350.                         d_print2(H_size, Gamen, Iti, Koukan);
  351.                     }
  352.                     end_sw = 0;
  353.                     cansel = TRUE;
  354.                 }
  355.                 if ((px >= 35) && (px < 45)) {
  356.                     cansel = TRUE;
  357.                 }
  358.             }
  359.         }
  360.     }
  361.     if (end_sw) {
  362.         for (i = 29; i >= (PM_Y - 1); i--) {
  363.             p_lin(lp + i, i);
  364.         }
  365.     }
  366.     msarea(0, 0, GWIDTH - 1, 511);
  367.     wait_mb_off();
  368. }
  369.  
  370.  
  371. /*
  372.     ハードコピーを使用した画面イメージ印字
  373. */
  374.  
  375. static void
  376. d_print2(int p1, int p2, int p3, int p4)
  377. {
  378.     int sw, i, j, k;
  379.     int g_cnt;
  380.  
  381.     sw = 1;
  382.     i = 0;
  383.     j = 0;
  384.     k = 0;
  385.     g_cnt = 0;        /* default(all page) */
  386.     HCSIZE = p1;
  387.  
  388.     cutrev_Mode = TRUE;
  389.  
  390.     if ((p2 >= 2) && (p2 <= 6)) {
  391.         g_cnt = p2 - 1;
  392.     }
  393.     if (p3 == 9) {
  394.         i = lp;
  395.     }
  396.     dout();
  397.     OS_CUROF();
  398.     cls();
  399.     while (sw) {
  400.         if (esc_on()) {
  401.             clr_kbf();
  402.             j = 0;
  403.             break;
  404.         }
  405.         clr_kbf();
  406.         if ((j != 31) || (k != (g_cnt - 1)) || (!dinstr(lhp[i], LARGE_IDSTR))) {
  407.             p_lin(i, j - 1);
  408.             i++;
  409.         }
  410.         j++;
  411.         if (((j) % 32) == 0) {
  412.             j = 0;
  413.             hcopy();
  414.             cls();
  415.             k++;
  416.         }
  417.         if ((g_cnt != 0) && (k >= g_cnt)) {
  418.             k = 0;
  419.             if (p4 == 10) {
  420.                 B_PRINT("\r\n\t\t紙を交換しましょう");
  421.                 B_PRINT("\r\n\r\n\tよろしかったら[Return/Enter]キーを押して下さい");
  422.                 B_PRINT("\r\n\r\n\t\t[ESC]キーで中止できます");
  423.                 while (1) {
  424.                     if (cr_on() || enter_on()) {    /* ENTERでもOK */
  425.                         if (SNSPRN()){
  426.                             break;
  427.                         } else {
  428.                             cls();
  429.                             B_PRINT("\r\n\r\n\tプリンタを印刷可能状態にして下さい");
  430.                             B_PRINT("\r\n\r\n\tよろしかったら[return]キーを押して下さい");
  431.                             B_PRINT("\r\n\r\n\t\t[ESC]キーで中止できます");
  432.                         }
  433.                     }
  434.                     if (esc_on()) {
  435.                         sw = 0;
  436.                         break;
  437.                     }
  438.                     clr_kbf();
  439.                 }
  440.             } else if (p4 == 12) {
  441.                 OUTPRN(12);
  442.             }
  443.             cls();
  444.         }
  445.         if (i >= lpmx) {
  446.             break;
  447.         }
  448.     }
  449.     if (j != 0) {
  450.         hcopy();
  451.     }
  452.     cutrev_Mode = FALSE;
  453.  
  454.     cls();
  455.     din(TRUE);
  456.     p_scr();
  457.     p_fpt(1);
  458.     p_time(1);
  459.     mouse(1);
  460.     wait_mb_off();
  461. }
  462.  
  463. static void
  464. hcopy(void)
  465. {
  466.     asm("
  467.     move.l    _HCSIZE,d0
  468.     trap    #12
  469.     ");
  470. }
  471.